#include <iostream>
#include <string>
#include "../comm/httplib.h"
#include "oj_control.hpp"
#include <thread>

using namespace ns_control;
using namespace httplib;

/*************
 * 实现对请求的路由功能
 * 1. 首页请求：获取所有的题目列表
 * 2. 题目请求：获取对应题目的描述和编写区域
 * 3. 提交代码请求：我们对用户提交的代码进行判题（3.1 测试用例 3.2 编译运行 compile_and_run）
 **********/
int main()
{
    Control ctrl; // 定义为全局变量，可以直接被lambda读到
    
    //设置检测主机线程
    std::thread onlinecheck([&]()
    {
        ctrl.RecoveryMachine();
    });

    //设置路由线程
    std::thread route([&]()
    {
        //首先来实现http请求的"路由"功能
        Server svr;
        // 对于用户提交的http请求，大致有三个方向：
        // 首页请求
        svr.Get("/all_questions", [&](const Request& req, Response& res)
        {
            // 对首页请求回应
            // 测试：
            //res.set_content("这是获取的题目列表", "text/plain;charset=utf-8");
            std::string html;
            ctrl.AllQuestions(&html); //获取网页信息
            res.set_content(html, "text/html;charset=utf-8");
        });

        // 题目请求
        // /questions/100 —> 采用正则匹配
        // \d 表示匹配整数
        // (\d+)表示连续匹配整数
        svr.Get(R"(/question/(\d+))", [&](const Request& req, Response& res)
        {
            // std::string number = req.matches[1];
            // res.set_content("这是指定的一道题目", "text/plain;charset=utf-8");

            std::string number = req.matches[1];
            std::string html;
            ctrl.OneQuestion(number, &html); //获取网页信息
            res.set_content(html, "text/html;charset=utf-8"); //设置内容
        });

        //用户提交代码
        svr.Post(R"(/judge/(\d+))", [&](const Request& req, Response& res)
        {
            std::string number = req.matches[1];
            std::string result_json;
            
            ctrl.JudgeQuestion(number, req.body, &result_json);
            res.set_content(result_json, "application/json;charset=utf-8");
            // res.set_content("指定的题目" + number, "text/plain;charset=utf-8");
        });
        //设置等待
        svr.set_base_dir("./wwwroot");
        svr.listen("0.0.0.0", 8080); 
    
    });

    onlinecheck.detach(); //线程分离
    route.join(); //线程阻塞等待

    return 0;
}